﻿//===========================[ 8 / 8 / 2011 LVI ]=============================
//				Copyright c Vitaly Lyaschenko <SkyChameleon@gmail.com>
// 								Header file
// Purpose: 
//=============================================================================
#pragma once

#include "kernel.h"
#include "mathlib.h"

class cCamera
{
public:
	cCamera();
	~cCamera();

	void setPerspective( const float aspectRatio );
	void setLookAt( const vec3 &position, const vec3 &center, const vec3 &up );
	// установка позиции/трансформации камеры
	void setPosition( const vec3 pos ) { m_EyePos = pos; }
	void setPosition( const float x, const float y, const float z ) 
	{ 
		m_EyePos.x = x;
		m_EyePos.y = y;
		m_EyePos.z = z;
	}
	vec3 getPosition() const { return m_EyePos; }

	void rotate( const vec3 &angle ) { m_Rotation += angle; }
	void rotate( const float x, const float y, const float z )
	{
		m_Rotation.x += x;
		m_Rotation.y += y;
		m_Rotation.z += z;
	}

	void zoom();

	void setX( float x ) { m_EyePos.x = x; }
	void setY( float y ) { m_EyePos.y = y; }
	void setZ( float z ) { m_EyePos.z = z; }

	float getX() const { return m_EyePos.x; }
	float getY() const { return m_EyePos.y; }
	float getZ() const { return m_EyePos.z; }

	void moveUp( float dist );

	void moveForward( float dist );

	void moveForwardOnGround( float dist );

	void moveSide( float dist );

	//vec3 getView() const { return m_toView; }
	//vec3 getUp()   const { return m_Up; }

	mat4 getRotationMtr();
	mat4 & getMtrProjection();
	mat4 & getMtrView();

	float getYaw()   const { return m_Rotation.x; }
	float getPitch() const { return m_Rotation.y; }
	float getRoll()  const { return m_Rotation.z; }

	void Yaw( float angle )   { m_Rotation.x += angle; }
	void Pitch( float angle ) { m_Rotation.y += angle; }
	void Roll( float angle )  { m_Rotation.z += angle; }

	void update( float deltaTime );

private:
	// позиция камеры
	vec3 m_EyePos;
	// куда смотреть

	vec3 m_xAxis,
		 m_yAxis,
		 m_zAxis;
	vec3 m_viewDir;
	// верх для камеры <^>
	vec3 m_Up;

	mat4 m_ViewMtr,
		 m_ProjectionMtr,
		 m_ViewProjectionMtr;

	// повороты в градусах вокруг осей	 
	vec3 m_Rotation;
	//float yaw, pitch, roll;
	// скорость передвижения камеры
	float speed;
	// множитель
	float multiplier;

	cMouse *pMous;
};
